/**
 * 医疗系统专用日期时间工具集
 * 包含诊断记录、预约等医疗场景专用方法
 */

/**
 * 格式化日期时间 (医疗系统专用)
 * @param {Date|string|number} date - 可接受的日期格式
 * @param {string} format - 格式字符串 (默认医疗系统标准格式)
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY-MM-DD') {
    if (!date) return '未记录';

    // 统一转换为Date对象
    const d = new Date(date);
    if (isNaN(d.getTime())) return '日期无效';

    // 补零函数
    const padZero = (num) => (num < 10 ? `0${num}` : num);

    // 医疗专用格式映射
    const formatMap = {
        'YYYY': d.getFullYear(),
        'MM': padZero(d.getMonth() + 1),
        'DD': padZero(d.getDate()),
        'HH': padZero(d.getHours()),
        'mm': padZero(d.getMinutes()),
        'ss': padZero(d.getSeconds()),
        '星期': '星期' + ['日', '一', '二', '三', '四', '五', '六'][d.getDay()],
        '周': '周' + ['日', '一', '二', '三', '四', '五', '六'][d.getDay()],
        '上午下午': d.getHours() < 12 ? '上午' : '下午'
    };

    // 替换格式化字符串
    return format.replace(/(YYYY|MM|DD|HH|mm|ss|星期|周|上午下午)/g,
        (match) => formatMap[match] || '');
}

/**
 * 生成医疗记录时间戳格式 (用于诊断记录时间轴)
 * @param {Date} date - 日期
 * @returns {string} 格式如 "2023年11月15日 周三 上午"
 */
export function medicalTimestamp(date) {
    return formatDate(date, 'YYYY年MM月DD日 星期 上午下午');
}

/**
 * 计算患者年龄 (根据出生日期)
 * @param {Date|string} birthDate - 出生日期
 * @param {Date|string} [baseDate] - 基准日期(默认当前日期)
 * @returns {string} 年龄描述 如"32岁"或"8个月"
 */
export function calculateAge(birthDate, baseDate = new Date()) {
    const birth = new Date(birthDate);
    const base = new Date(baseDate);

    if (isNaN(birth.getTime())) return '年龄未知';

    const fullYears = base.getFullYear() - birth.getFullYear();
    const monthDiff = base.getMonth() - birth.getMonth();

    if (monthDiff < 0 || (monthDiff === 0 && base.getDate() < birth.getDate())) {
        return `${fullYears - 1}岁`;
    }

    // 小于1岁显示月数
    if (fullYears === 0) {
        const months = (base.getMonth() + 12) - birth.getMonth();
        return `${months}个月`;
    }

    return `${fullYears}岁`;
}

/**
 * 计算用药周期 (开始日期 + 天数)
 * @param {Date|string} startDate - 开始日期
 * @param {number} days - 天数
 * @returns {string} 格式如 "2023-11-15 至 2023-11-22"
 */
export function medicationPeriod(startDate, days) {
    const start = new Date(startDate);
    if (isNaN(start.getTime())) return '日期无效';

    const end = new Date(start);
    end.setDate(start.getDate() + days);

    return `${formatDate(start)} 至 ${formatDate(end)}`;
}

/**
 * 判断是否紧急时间 (最近3天内)
 * @param {Date|string} date - 日期
 * @returns {boolean} 是否紧急
 */
export function isUrgent(date) {
    const target = new Date(date);
    if (isNaN(target.getTime())) return false;

    const now = new Date();
    const diffInDays = Math.floor((now - target) / (1000 * 60 * 60 * 24));
    return diffInDays <= 3;
}

/**
 * 生成随访时间建议 (诊断后1周、1个月、3个月)
 * @param {Date|string} diagnosisDate - 诊断日期
 * @returns {Array} 随访时间建议数组
 */
export function generateFollowupDates(diagnosisDate) {
    const date = new Date(diagnosisDate);
    if (isNaN(date.getTime())) return [];

    return [
        { label: '1周后随访', date: addDays(date, 7) },
        { label: '1个月后随访', date: addMonths(date, 1) },
        { label: '3个月后随访', date: addMonths(date, 3) }
    ];
}

// 私有方法：添加天数
function addDays(date, days) {
    const result = new Date(date);
    result.setDate(result.getDate() + days);
    return result;
}

// 私有方法：添加月数
function addMonths(date, months) {
    const result = new Date(date);
    result.setMonth(result.getMonth() + months);
    return result;
}

export default {
    formatDate,
    medicalTimestamp,
    calculateAge,
    medicationPeriod,
    isUrgent,
    generateFollowupDates
};
